
import javax.microedition.lcdui.*;

public class Jogo {

  public static final byte Vazio = 0;
  public static final byte Branco = 0;
  public static final byte Preto = 8;
  public static final byte Peca = 7;
  public static final byte Cor = 8;
  public static final byte Peao = 1;
  public static final byte Torre = 2;
  public static final byte Bispo = 3;
  public static final byte Cavalo = 4;
  public static final byte Rainha = 5;
  public static final byte Rei = 6;

  private int adversario;

  private String ultimaJogada;

  private int jogada;

  private boolean minhaVez;

  private byte tabuleiro[][] = new byte[8][];
  {
    for (int i = 0; i < 8; i++)
      tabuleiro[i] = new byte [8];
  }

  Image imagens[] = new Image[12];
  String[] arquivos =
  {
    "/imagens/branco/peao.gif",
    "/imagens/branco/torre.gif",
    "/imagens/branco/bispo.gif",
    "/imagens/branco/cavalo.gif",
    "/imagens/branco/rainha.gif",
    "/imagens/branco/rei.gif",
    "/imagens/preto/peao.gif",
    "/imagens/preto/torre.gif",
    "/imagens/preto/bispo.gif",
    "/imagens/preto/cavalo.gif",
    "/imagens/preto/rainha.gif",
    "/imagens/preto/rei.gif"
  };

  public Jogo(int adv) {

    try {
      for (int i = 0; i < 12; i ++)
         imagens[i] = Image.createImage(arquivos[i]);
    } catch(Exception e) {
      e.printStackTrace();
    }

    int lin, col;

    for (lin = 2; lin <= 5; lin++)
      for (col = 0; col < 8; col ++)
        tabuleiro[lin][col] = Vazio;

    for (col = 0; col < 8; col ++)
      tabuleiro[1][col] = Peao + Preto;

    tabuleiro[0][0] = tabuleiro[0][7] = Torre + Preto;
    tabuleiro[0][1] = tabuleiro[0][6] = Cavalo + Preto;
    tabuleiro[0][2] = tabuleiro[0][5] = Bispo + Preto;
    tabuleiro[0][3] = Rainha + Preto;
    tabuleiro[0][4] = Rei + Preto;

    for (col = 0; col < 8; col ++)
      tabuleiro[6][col] = Peao + Branco;

    tabuleiro[7][0] = tabuleiro[7][7] = Torre + Branco;
    tabuleiro[7][1] = tabuleiro[7][6] = Cavalo + Branco;
    tabuleiro[7][2] = tabuleiro[7][5] = Bispo + Branco;
    tabuleiro[7][3] = Rainha + Branco;
    tabuleiro[7][4] = Rei + Branco;

    jogada = 0;

    minhaVez = true;

    adversario = adv;

  }

  public byte getPeca(int lin, int col) {

    return (tabuleiro[lin][col]);

  }

  public Image getImagem(byte peca) {

    return (imagens[(peca & Peca) - 1 + ((peca & Cor) == Preto ? 6 : 0)]);

  }

  public boolean movePeca(int lin_de, int col_de, int lin_para, int col_para) {

    if ((tabuleiro[lin_para][col_para] == Vazio) ||
      ((tabuleiro[lin_para][col_para] & Cor) != getCorJogador())) {

      tabuleiro[lin_para][col_para] = tabuleiro[lin_de][col_de];
      tabuleiro[lin_de][col_de] = Vazio;

      jogada++;

      ultimaJogada = String.valueOf((char) (col_de + 65)) + (8 - lin_de) +
                     String.valueOf((char) (col_para + 65)) + (8 - lin_para);

      minhaVez = ! minhaVez;
    }

    return (true);

  }

  public boolean vezBranco() {

    return (getCorJogador() == Branco);

  }

  private byte getCorJogador() {

    byte cor;

    if (jogada % 2 == 0)
      cor = Branco;
    else
      cor = Preto;

    return cor;

  }

  public boolean podeMarcar(int lin, int col) {

    return (tabuleiro[lin][col] != Vazio && (tabuleiro[lin][col] & Cor) == getCorJogador());

  }

  public void setPeca(int lin, int col, byte peca) {

    tabuleiro[lin][col] = peca;

  }

  public String getAdversario() {

    String s = "";

    if (adversario > 0)
      s = Integer.toString(adversario);
    else
      s = "local";

    return (s);

  }

  public String getUltimaJogada() {

    String s = "";

    if (jogada > 0) {
      s = ultimaJogada;
    }

    return (s);

  }

  public String getStatus() {

    String s;

    if (adversario == 0) {
      s = (jogada % 2 == 0 ? "Vez Branco!" : "Vez Preto!");
    } else {
      s = (minhaVez ? "Sua Vez!" : "Aguardando!");
    }

// sua vez, jogado, enviando, enviado, aguardando

    return (s);

  }

  public boolean podeJogar() {

    return (minhaVez || adversario == 0);

  }

  public int getJogada() {

    return (jogada);

  }

}
